/**
 * @description 手写一个curry函数
 * 该函数的特点是输入一个函数，返回一个函数，
 * 如果接收的参数不够，一直累积参数，
 * 如果接收的参数够了，执行传入函数返回结果
 */

function curry(fn: Function): Function{
    const fnArgsLength = fn.length;
    let args: any[] = [];

    function calc(this: any, ...newArgs: any[]){
        args = [...args, ...newArgs];
        if(args.length < fnArgsLength){
            // 参数不够，返回函数
            return calc;
        } else {
            // 参数够了，执行fn返回结果
            return fn.apply(this, args.slice(0, fnArgsLength));
        }
    }

    return calc;
}

function add(a, b, c){
    return a+b+c;
}

const curryAdd = curry(add);
const res = curryAdd(10)(20)(30);
console.log(res);
